package com.lym.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.lym.reggie.common.BaseContext;
import com.lym.reggie.common.R;
import com.lym.reggie.entity.User;
import com.lym.reggie.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private RedisTemplate redisTemplate;

    //发送验证码
    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user){
        //1 发送验证码、2 将生成的验证码保存入Session
        String phone = user.getPhone();
        if (StringUtils.isNotEmpty(phone)){
            /*String validateCode = ValidateCodeUtils.generateValidateCode(6).toString();
            try {
                //1. 发送验证码
                TengxunSMSUtils.sendShortMessage(TengxunSMSUtils.TEMPLATE_ID,phone,validateCode);
                //2 将生成的验证码保存入Session
                session.setAttribute(phone,validateCode);

                return R.success("发送成功");
            } catch (ClientException e) {
                e.printStackTrace();
                //发送失败
                return R.error(phone+"验证码 发送失败");
            }*/

            //为避免浪费，先不发送验证码 密码统一为111111
            String validateCode = "111111";
            /*//将验证码存储到sessiom
            session.setAttribute(phone,validateCode);*/
            //将验证码缓存到Redis中，并设置有效期为5分钟
            redisTemplate.opsForValue().set(phone,validateCode,5, TimeUnit.MINUTES);
            return R.success("验证码发送成功!");
        }
        return R.error("手机号为空");
    }

    //登录
    @PostMapping("/login")
    public R<String> login(@RequestBody Map map,HttpSession session){
        //校验验证码是否正确 -- 若正确则登录成功，若为新用户则自动帮助注册 -- session中保存用户登录状态

        String phone = map.get("phone").toString();
        String validateCode = map.get("code").toString();


//        String codeIn = session.getAttribute(phone).toString();
        String codeIn = (String) redisTemplate.opsForValue().get(phone);

        // 1. 校验验证码是否正确
        if (codeIn!=null && codeIn.equals(validateCode)){
            //校验通过 则登录成功，若为新用户则自动帮助注册 -- 向客户端写入Cookie，将会员信息保存到redis
            // 2. 若为新用户则 自动注册
            LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(User::getPhone,phone);
            User user = userService.getOne(queryWrapper);
            if (user==null){
                //自动注册
                user = new User();
                user.setPhone(phone);
                user.setStatus(1);//可设置可不设置，因为数据库帮我们设置了默认值
                userService.save(user);
            }
            //登陆成功，则删除Redis缓存的验证码
            redisTemplate.delete(phone);


            // 3.session中保存用户登录状态，这样过滤器就会放行
            session.setAttribute("user",user.getId());
            return R.success("登陆成功！");
        }

        return R.error("验证码输入错误！");
    }


    /**
     * 退出功能
     * ①在controller中创建对应的处理方法来接受前端的请求，请求方式为post；
     * ②清理session中的用户id
     * ③返回结果（前端页面会进行跳转到登录页面）
     * @return
     */
    @PostMapping("/loginout")
    public R<String> loginout(HttpSession session){
        session.removeAttribute("user");
        return R.success("退出成功");
    }
}
